<?php
class facturacion_model extends privilegios_model{
	
	function __construct(){
		parent::__construct();
	}
	
	
	
	/**
	 * 					FACTURACION
	 * **********************************************
	 * Obtiene el listado de ordenes de trabajo
	 */
	public function getFacturas(){
		$sql = '';
		//paginacion
		$params = array(
				'result_items_per_page' => '30',
				'result_page' 			=> (isset($_GET['pag'])? $_GET['pag']: 0)
		);
		if($params['result_page'] % $params['result_items_per_page'] == 0)
			$params['result_page'] = ($params['result_page']/$params['result_items_per_page']);
	
		//Filtros para buscar
		if($this->input->get('ffecha1') != '' && $this->input->get('ffecha2') != '')
			$sql = " AND Date(c.fecha) BETWEEN '".$this->input->get('ffecha1')."' AND '".$this->input->get('ffecha2')."'";
		elseif($this->input->get('ffecha1') != '')
			$sql = " AND Date(c.fecha) = '".$this->input->get('ffecha1')."'";
		elseif($this->input->get('ffecha2') != '')
			$sql = " AND Date(c.fecha) = '".$this->input->get('ffecha2')."'";
		
		if($this->input->get('fserie') != '')
			$sql .= " AND c.serie = '".$this->input->get('fserie')."'";
		if($this->input->get('ffolio') != '')
			$sql .= " AND c.folio = '".$this->input->get('ffolio')."'";
		if($this->input->get('fstatus') != '')
			$sql .= " AND c.status = '".$this->input->get('fstatus')."'";
		if($this->input->get('fid_cliente') != '')
			$sql .= " AND cs.id_sucursal = '".$this->input->get('fid_cliente')."'";
	
		$query = BDUtil::pagination("
				SELECT c.id_factura, Date(c.fecha) AS fecha, c.serie, c.folio, cs.nombre_fiscal, c.status,
					total
				FROM facturas AS c
					INNER JOIN clientes_sucursales AS cs ON cs.id_sucursal = c.id_cliente
				WHERE 1 = 1".$sql."
				ORDER BY (Date(c.fecha), c.serie, c.folio) DESC
				", $params, true);
		$res = $this->db->query($query['query']);
	
		$response = array(
				'fact' => array(),
				'total_rows' 		=> $query['total_rows'],
				'items_per_page' 	=> $params['result_items_per_page'],
				'result_page' 		=> $params['result_page']
		);
		if($res->num_rows() > 0)
			$response['fact'] = $res->result();
	
		return $response;
	}
	
	/**
	 * Obtiene la informacion de una factura
	 */
	public function getInfoFactura($id, $info_basic=false){
		$res = $this->db
			->select("*, (SELECT SUM(total) FROM facturas_abonos WHERE id_factura = facturas.id_factura) AS ab_total")
			->from('facturas')
			->where("id_factura = '".$id."'")
		->get();
		if($res->num_rows() > 0){
			$response['info'] = $res->row();
			$response['info']->fecha = substr($response['info']->fecha, 0, 10);
			$res->free_result();
			if($info_basic)
				return $response;
				
			$this->load->model('clientes_model');
			$prov = $this->clientes_model->getInfoCliente($response['info']->id_cliente, true);
			$response['info']->cliente = $prov['info'];
				
			//ordenes t
			$response['ordenest'] = array();
			$res = $this->db
				->select('o.id_ordent, o.folio')
				->from('facturas_ordenest AS fo')
					->join('ordenest AS o', 'o.id_ordent = fo.id_ordent', 'inner')
				->where("fo.id_factura = '".$id."'")
			->get();
			if($res->num_rows() > 0){
				$response['ordenest'] = $res->result();
			}
			$res->free_result();
			
			if(count($response['ordenest']) > 0){
				$ids_ordns = '';
				foreach($response['ordenest'] as $itm){
					$ids_ordns .= "','".$itm->id_ordent;
				}
				$ids_ordns = substr($ids_ordns, 3);
				
				//productos
				$res = $this->db
					->select('p.id_producto, p.codigo, p.nombre, pu.abreviatura as unidad, pu.nombre as unidad2, cp.taza_iva, 
							cp.cantidad, cp.precio_unitario, cp.importe, cp.importe_iva, cp.total')
					->from('ordenest_productos AS cp')
						->join('productos AS p', 'p.id_producto = cp.id_producto', 'inner')
						->join('productos_unidades AS pu', 'p.id_unidad = pu.id_unidad', 'inner')
					->where("cp.id_ordent IN ('".$ids_ordns."')")
				->get();
				if($res->num_rows() > 0){
					$response['productos'] = $res->result();
				}
				$res->free_result();
			}
			
			return $response;
		}else
			return false;
	}
	
	/**
	 * Obtiene el folio de acuerdo a la serie seleccionada
	 */
	public function getFolioSerie($serie){
		$res = $this->db->select('folio')->from('facturas')
			->where("serie = '".$serie."'")->order_by('folio', 'DESC')
			->limit(1)->get()->row();
		$folio = (isset($res->folio)? $res->folio: 0)+1;
		
		$res = $this->db->select('*')->from('facturas_series_folios')
			->where("serie = '".$serie."'")->limit(1)->get()->row();
		
		if(is_object($res)){
			if($folio < $res->folio_inicio)
				$folio = $res->folio_inicio;
			
			$res->folio = $folio;
			$msg = 'ok';

			if(String::suma_fechas($res->ano_aprobacion, 729) <= date('Y-m-d'))
				$msg = "El codigo bidimensional ya caduco, solicita uno nuevo.";
			if($folio > $res->folio_fin || $folio < $res->folio_inicio)
				$msg = "El folio ".$folio." está fuera del rango de folios para la serie ".$serie.". <br>
					Verifique las configuraciones para asignar un nuevo rango de folios";
		}else 
			$msg = 'La serie no existe.';
		
		return array($res, $msg);
	}
	
	/**
	 * Agrega una factura a la bd
	 */
	public function addFactura(){
		$status = ($this->input->post('dcondicion_pago')=='co'? 'pa': 'p');
		
		$id_factura = BDUtil::getId();
		$data = array(
			'id_factura' 		=> $id_factura,
			'id_cliente' 		=> $this->input->post('did_cliente'),
			'id_empleado' 		=> $_SESSION['id_empleado'],
			'serie' 			=> $this->input->post('dserie'),
			'folio' 			=> $this->input->post('dfolio'),
			'no_aprobacion' 	=> $this->input->post('dno_aprobacion'),
			'ano_aprobacion' 	=> $this->input->post('dano_aprobacion'),
			'fecha' 			=> $this->input->post('dfecha'),
			'domicilio' 		=> $this->input->post('dcliente_domici'),
			'ciudad' 			=> $this->input->post('dcliente_ciudad'),
			'subtotal' 			=> $this->input->post('dtsubtotal'),
			'importe_iva' 		=> $this->input->post('dtiva'),
			'retencion_iva' 	=> $this->input->post('dtretencion_iva'),
			'total' 			=> $this->input->post('dttotal'),
			'total_letra' 		=> $this->input->post('dttotal_letra'),
			'img_cbb' 			=> $this->input->post('dimg_cbb'),
			'forma_pago' 		=> $this->input->post('dforma_pago'),
			'metodo_pago' 		=> $this->input->post('dmetodo_pago'),
			'metodo_pago_digitos' => $this->input->post('dmetodo_pago_digitos'),
			'condicion_pago' 	=> $this->input->post('dcondicion_pago'),
			'plazo_credito' 	=> $this->input->post('dplazo_credito'),
			'status' 			=> $status
		);
		$this->db->insert('facturas', $data);
		
		//ordenes t a la factura
		if(isset($_POST['dids_ordenest'])){
			$sql = '';
			$data = array();
			foreach($_POST['dids_ordenest'] as $key => $itm){
				if($itm{0} != ''){
					$data[] = array('id_factura' => $id_factura, 'id_ordent' => $itm);
					
					$this->db->update('ordenest', array('facturada' => 't'), "id_ordent = '".$itm."'");
					
					$sql .= " OR id_ordent = '".$itm."'";
				}
			}
			if(count($data) > 0){
				$this->db->insert_batch('facturas_ordenest', $data);
				
				//agregamos el abono de lo q ya se pago en ordenes t
				$sql 			 = substr($sql, 4);
				$data_ab 		 = $this->db->query("SELECT SUM(total) AS total FROM ordenest_abonos WHERE ".$sql)->row();
				if($data_ab->total > 0){
					$_POST['dmonto'] = $data_ab->total;
					$_POST['dfecha'] = date("Y-m-d");
					$this->addAbono($id_factura, 'Pagos y abonos de las ordenes agregadas a la factura.', false);
				}
			}
		}
		
		$this->enviarFactura($id_factura, $this->input->post('demail'));

		return array(true, $status, $id_factura);
	}
	
	/**
	 * Cancela una factura, la elimina
	 */
	public function cancelaFactura(){
		$this->db->update('facturas', array('status' => 'ca'), "id_factura = '".$_GET['id']."'");
		$this->db->update('facturas_abonos', array('tipo' => 'ca'), "id_factura = '".$_GET['id']."'");
		
		$res = $this->db->select('id_ordent')->from('facturas_ordenest')->where("id_factura = '".$_GET['id']."'")->get();
		foreach($res->result() as $itm)
			$this->db->update('ordenest', array('facturada' => 'f'), "id_ordent = '".$itm->id_ordent."'");
		
		$this->enviarFactura($_GET['id']);
		return array(true, '');
	}
	
	/**
	 * Actualiza los digitos del metodo de pago de una factura
	 */
	public function metodo_pago(){
		$this->db->update('facturas', array('metodo_pago_digitos' => $_POST['mp_digitos']), "id_factura = '".$_POST['id_factura']."'");
		return array(true, '');
	}
	
	
	/**
	 * Agrega abono a una factura
	 * @param unknown_type $id_factura
	 * @param unknown_type $concepto
	 */
	public function addAbono($id_factura=null, $concepto=null, $registr_bancos=true){
		$id_factura = $id_factura==null? $this->input->get('id'): $id_factura;
		$concepto = $concepto==null? $this->input->post('dconcepto'): $concepto;
	
		$data = $this->obtenTotalAbonosC($id_factura);
		if($data->abonos < $data->total){ //Evitar que se agreguen abonos si esta pagada
			$pagada = false;
			//compruebo si se pasa el abono al total de la factura y activa a pagado
			if(($this->input->post('dmonto')+$data->abonos) >= $data->total){
				if(($this->input->post('dmonto')+$data->abonos) > $data->total)
					$_POST['dmonto'] = $this->input->post('dmonto') - (($this->input->post('dmonto')+$data->abonos) - $data->total);
				$pagada = true;
			}
				
			$id_abono = BDUtil::getId();
			$data_abono = array(
					'id_abono' => $id_abono,
					'id_factura' => $id_factura,
					'fecha' => $this->input->post('dfecha'),
					'concepto' => $concepto,
					'total' => $this->input->post('dmonto')
			);
			$this->db->insert('facturas_abonos', $data_abono);
				
			if($pagada){
				$this->db->update('facturas', array('status' => 'pa'), "id_factura = '".$id_factura."'");
			}
				
			if($registr_bancos){
				//Registramos la Operacion en Bancos
				$this->load->model('banco_model');
				$respons = $this->banco_model->addOperacion($this->input->post('dcuenta'));
			}
				
			return array(true, 'Se agregó el abono correctamente.', $id_abono);
		}
		return array(true, 'La orden de trabajo ya esta pagada.', '');
	}
	
	/**
	 * Elimina abonos de cobranza (de una factura)
	 * @param unknown_type $id_abono
	 * @param unknown_type $id_factura
	 */
	public function deleteAbono($id_abono, $id_factura){
		$this->db->delete('facturas_abonos', "id_abono = '".$id_abono."'");
	
		$data = $this->obtenTotalAbonosC($id_factura);
		if($data->abonos >= $data->total){ //si abonos es = a la factura se pone pagada
			$this->db->update('facturas', array('status' => 'pa'), "id_factura = '".$id_factura."'");
		}else{ //si abonos es menor se pone pendiente
			$this->db->update('facturas', array('status' => 'p'), "id_factura = '".$id_factura."'");
		}
	
		return array(true, '');
	}
	
	private function obtenTotalAbonosC($id){
		$data = $this->db->query("
				SELECT
						c.total,
						COALESCE(ab.abonos, 0) AS abonos
				FROM facturas AS c
					LEFT JOIN (
						SELECT id_factura, Sum(total) AS abonos
						FROM facturas_abonos
						WHERE id_factura = '".$id."' AND tipo <> 'ca'
						GROUP BY id_factura
					) AS ab ON c.id_factura = ab.id_factura
				WHERE c.id_factura = '".$id."'", true);
		return $data->row();
	}
	
	
	
	
	/**
	 * 					SERIES Y FOLIOS
	 * ***************************************************
	 * Obtiene el listado de series y folios para administrarlos
	 */
	public function getSeriesFolios($per_pag='30'){
		
		//paginacion
		$params = array(
				'result_items_per_page' => $per_pag,
				'result_page' => (isset($_GET['pag'])? $_GET['pag']: 0)
		);
		if($params['result_page'] % $params['result_items_per_page'] == 0)
			$params['result_page'] = ($params['result_page']/$params['result_items_per_page']);
		
// 		if($this->input->get('fserie')!='')
// 			$this->db->where('serie',$this->input->get('fserie'));
		
		$this->db->like('lower(serie)',mb_strtolower($this->input->get('fserie'), 'UTF-8'));
		$this->db->order_by('serie');
		$this->db->get('facturas_series_folios');
		$sql	= $this->db->last_query();
		
		$query = BDUtil::pagination($sql, $params, true);
		$res = $this->db->query($query['query']);
		
		$data = array(
				'series' 			=> array(),
				'total_rows' 		=> $query['total_rows'],
				'items_per_page' 	=> $params['result_items_per_page'],
				'result_page' 		=> $params['result_page']
		);
		
		if($res->num_rows() > 0)
			$data['series'] = $res->result();
		
		return $data;
	}
	
	/**
	 * Obtiene la informacion de una serie/folio
	 * @param unknown_type $id_serie_folio
	 */
	public function getInfoSerieFolio($id_serie_folio = ''){
		$id_serie_folio = ($id_serie_folio != '') ? $id_serie_folio : $this->input->get('id'); 

		$res = $this->db->select('*')->from('facturas_series_folios')->where('id_serie_folio',$id_serie_folio)->get()->result();
		return $res;
	}
	
	/**
	 * Agrega una serie/folio a la base de datos
	 */
	public function addSerieFolio(){
		$path_img = '';
		//valida la imagen
		$upload_res = UploadFiles::uploadImgSerieFolio();

		if(is_array($upload_res)){
			if($upload_res[0] == false)
				return array(false, $upload_res[1]);
			$path_img = $upload_res[1]['file_name']; //APPPATH.'images/series_folios/'.$upload_res[1]['file_name'];
		}
		
		$id_serie_folio	= BDUtil::getId();
		$data	= array(
				'id_serie_folio' => $id_serie_folio,
				'serie'	=> strtoupper($this->input->post('fserie')),
				'no_aprobacion'	=> $this->input->post('fno_aprobacion'),
				'folio_inicio'	=> $this->input->post('ffolio_inicio'),
				'folio_fin'		=> $this->input->post('ffolio_fin'),
				'ano_aprobacion'=> $this->input->post('fano_aprobacion'),
				'imagen' => $path_img,
		);
		
		if($this->input->post('fleyenda')!='')
			$data['leyenda'] = $this->input->post('fleyenda');
		
		if($this->input->post('fleyenda1')!='')
			$data['leyenda1'] = $this->input->post('fleyenda1');
		
		if($this->input->post('fleyenda2')!='')
			$data['leyenda2'] = $this->input->post('fleyenda2');		
		
		$this->db->insert('facturas_series_folios',$data);
		return array(true);
	}
	
	/**
	 * Modifica la informacion de un serie/folio
	 * @param unknown_type $id_serie_folio
	 */
	public function editSerieFolio($id_serie_folio=''){
		$id_serie_folio = ($id_serie_folio != '') ? $id_serie_folio : $this->input->get('id');
		
		$path_img = '';
		//valida la imagen
		$upload_res = UploadFiles::uploadImgSerieFolio();

		if(is_array($upload_res)){
			if($upload_res[0] == false)
				return array(false, $upload_res[1]);
			$path_img = $upload_res[1]['file_name']; //APPPATH.'images/series_folios/'.$upload_res[1]['file_name'];
			
			/*$old_img = $this->db->select('imagen')->from('facturas_series_folios')->where('id_serie_folio',$id_serie_folio)->get()->row()->imagen;
			
			UploadFiles::deleteFile($old_img);*/
		}

		$data	= array(
				'serie'	=> strtoupper($this->input->post('fserie')),
				'no_aprobacion'	=> $this->input->post('fno_aprobacion'),
				'folio_inicio'	=> $this->input->post('ffolio_inicio'),
				'folio_fin'		=> $this->input->post('ffolio_fin'),
				'ano_aprobacion'=> $this->input->post('fano_aprobacion')
		);
		
		if($path_img!='')
			$data['imagen'] = $path_img;
		
		if($this->input->post('fleyenda')!='')
			$data['leyenda'] = $this->input->post('fleyenda');
		
		if($this->input->post('fleyenda1')!='')
			$data['leyenda1'] = $this->input->post('fleyenda1');
		
		if($this->input->post('fleyenda2')!='')
			$data['leyenda2'] = $this->input->post('fleyenda2');		
		
		$this->db->update('facturas_series_folios',$data, array('id_serie_folio'=>$id_serie_folio));
		
		return array(true);
	}	


	public function enviarFactura($id, $email=''){

		$res_fac = $this->db->select("*")->from('facturas')->where('id_factura', $id)->get()->row();
		$res_empresa = $this->db->select("*")->from('config')->where('id_config', '1')->get()->row();
		$res_cliente = $this->db->select("*")->from('clientes_sucursales')->where('id_sucursal', $res_fac->id_cliente)->get()->row();

		$res_cliente->email = $email==''? $res_cliente->email: $email;

		if($res_cliente->email != ''){
			include(APPPATH."libraries/php_mailer/class.phpmailer.php");

			$tipo_factu = $res_fac->serie=='NC'? 'Nota de Credito': 'Factura';
			$asunto = 'Ha recibido una COMPROBANTE FISCAL de '.$res_empresa->nombre_fiscal;

			if ($res_fac->status != "ca") {
				$msg_alt = 'Estimado Cliente: '.$res_cliente->nombre_fiscal.'. Usted está recibiendo un comprobante fiscal ('.$tipo_factu.' '.($res_fac->serie!=''? $res_fac->serie.'-': '').$res_fac->folio.') de '.$res_empresa->nombre_fiscal;
				$msg_html = '
				<p>Estimado Cliente: <strong>'.$res_cliente->nombre_fiscal.'</strong></p>
				<p>Usted está recibiendo un comprobante fiscal ('.$tipo_factu.' '.$res_fac->serie.'-'.$res_fac->folio.') de '.$res_empresa->nombre_fiscal.'</p>
				';
			}else{
				$msg_alt = 'HEMOS CANCELADO EL COMPROBANTE FISCAL '.$tipo_factu.' '.$res_fac->serie.'-'.$res_fac->folio.', HA QUEDADO SIN EFECTOS FISCALES PARA SU EMPRESA, POR LO QUE PEDIMOS ELIMINARLO Y NO INCLUIRLO EN SU CONTABILIDAD, YA QUE PUEDE REPRESENTAR UN PROBLEMA FISCAL PARA USTED O SU EMPRESA CUANDO EL SAT REALICE UNA FUTURA AUDITORIA EN SU CONTABILIDAD.';
				$msg_html = '
				<p>Estimado Cliente: <strong>'.$res_cliente->nombre_fiscal.'</strong></p>
				<p>HEMOS CANCELADO EL COMPROBANTE FISCAL '.$tipo_factu.' '.$res_fac->serie.'-'.$res_fac->folio.', HA QUEDADO SIN EFECTOS FISCALES PARA SU EMPRESA, POR LO QUE PEDIMOS ELIMINARLO Y NO INCLUIRLO EN SU CONTABILIDAD, YA QUE PUEDE REPRESENTAR UN PROBLEMA FISCAL PARA USTED O SU EMPRESA CUANDO EL SAT REALICE UNA FUTURA AUDITORIA EN SU CONTABILIDAD.</p>
				';
			}

			$msg_html .= '
				<p>Si usted desea que llegue el comprobante fiscal a otro correo electronico notifiquelo a: <br>
					'.$res_empresa->email.'</p>
				<p>Si por algun motivo, decea optener nuevamente su factura puede solicitarla a nuestra oficina al Tel. '.$res_empresa->telefono.'.<br>
				';

			date_default_timezone_set('America/Mexico_City'); //Se define la zona horaria
			#require_once('class.phpmailer.php'); //Incluimos la clase phpmailer

			$mail = new PHPMailer(true); // Declaramos un nuevo correo, el parametro true significa que mostrara excepciones y errores.

			$mail->IsSMTP(); // Se especifica a la clase que se utilizará SMTP

			try {
				//------------------------------------------------------
				$correo_emisor_em = 'redfirecolimafacturacion@gmail.com';
				$correo_emisor="redfirecolimafacturacion@gmail.com";     //Correo a utilizar para autenticarse
				                     //Gmail o de GoogleApps
				$nombre_emisor="Redfire Colima";               //Nombre de quien envía el correo
				$contrasena="r3df1r3f";          //contraseña de tu cuenta en Gmail
				$correo_destino=$res_cliente->email;      //Correo de quien recibe
				$nombre_destino= $res_cliente->nombre_fiscal;               //Nombre de quien recibe
				//--------------------------------------------------------
				$mail->SMTPDebug  = 0;                     // Habilita información SMTP (opcional para pruebas)
				                                         // 1 = errores y mensajes
				                                         // 2 = solo mensajes
				$mail->SMTPAuth   = true;                  // Habilita la autenticación SMTP
				$mail->SMTPSecure = "ssl";                 // Establece el tipo de seguridad SMTP
				$mail->Host       = "smtp.gmail.com";      // Establece Gmail como el servidor SMTP
				$mail->Port       = 465;                   // Establece el puerto del servidor SMTP de Gmail
				$mail->Username   = $correo_emisor;         // Usuario Gmail
				$mail->Password   = $contrasena;           // Contraseña Gmail
				//A que dirección se puede responder el correo
				$mail->AddReplyTo($correo_emisor_em, $nombre_emisor);

				//La direccion a donde mandamos el correo
				$emails = explode(',', $correo_destino);
				foreach ($emails as $key => $value) {
					$value = trim($value);
					if($value != '')
						$mail->AddAddress( $value, $nombre_destino );
				}
				
				$mail->AddAddress("redfirecolima2011@gmail.com", $nombre_emisor);
				//De parte de quien es el correo
				$mail->SetFrom($correo_emisor_em, $nombre_emisor);
				//Asunto del correo
				$mail->Subject = $asunto;
				//Mensaje alternativo en caso que el destinatario no pueda abrir correos HTML
				$mail->AltBody = $msg_alt;
				//El cuerpo del mensaje, puede ser con etiquetas HTML
				$mail->MsgHTML($msg_html);
				//Archivos adjuntos
				
        $archivo = $this->imprimir($id, 'S');
				$nombre_archivo1 = APPPATH.'/media/'.$res_empresa->rfc.$res_fac->serie.'-'.$res_fac->folio.".pdf";
				file_put_contents($nombre_archivo1, $archivo);
				
				$mail->AddAttachment($nombre_archivo1);      // Archivos Adjuntos
				// $mail->AddAttachment($nombre_archivo2);      // Archivos Adjuntos
				//Enviamos el correo
				$mail->Send();

				unlink($nombre_archivo1);
				return 9;
			} catch (phpmailerException $e) {
				$e->errorMessage(); //Errores de PhpMailer
			} catch (Exception $e) {
				$e->getMessage(); //Errores de cualquier otra cosa.
			}
			return 10;

			/*//Servidor internet
			$correo_emisor_em = 'facturas@chonitabananas.com';
			$nombre_emisor="Chonita Bananas";               //Nombre de quien envía el correo

			$axml = $this->descargarXML(false);	//xml

			$archivo = $this->descargarPDF(true);
			$archivo = chunk_split(base64_encode($archivo));

			$uid = md5(uniqid(time()));
	    $header = "From: CHONITA BANANAS S.P.R. DE R.L. <".$correo_emisor_em.">\r\n";
	    $header .= "Reply-To: ".$correo_emisor_em."\r\n";
	    $header .= "MIME-Version: 1.0\r\n";
	    $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
	    $header .= "This is a multi-part message in MIME format.\r\n";
	    $header .= "--".$uid."\r\n";
	    $header .= "Content-Type: text/html; charset=UTF-8\r\n";
	    $header .= "Content-Transfer-Encoding: 8bit\r\n";
	    $header .= $msg_html."\r\n\r\n";
	    $header .= "--".$uid."\r\n";
	    $header .= "Content-Type: application/pdf; name=\"".$axml[0].".pdf\"\r\n"; // use different content types here
	    $header .= "Content-Transfer-Encoding: base64\r\n";
	    $header .= "Content-Disposition: attachment; filename=\"".$axml[0].".pdf\"\r\n\r\n";
	    $header .= $archivo."\r\n\r\n";
	    $header .= "--".$uid."\r\n";
	    $header .= "Content-Type: text/xml; name=\"".$axml[0].".xml\"\r\n"; // use different content types here
	    $header .= "Content-Transfer-Encoding: base64\r\n";
	    $header .= "Content-Disposition: attachment; filename=\"".$axml[0].".xml\"\r\n\r\n";
	    $header .= chunk_split(base64_encode($axml[1]))."\r\n\r\n";
	    $header .= "--".$uid."--";
			mail($data[0]['email'], $asunto, $msg_html, $header);*/
		}else
			return 11;
	}

	public function imprimir($id_fac, $type_output='I'){
		if(isset($id_fac{0})){
			//factura
			$this->load->model('facturacion_model');
			$data = $this->facturacion_model->getInfoFactura($id_fac);
			
			$res = $this->db
				->select('*')
				->from('facturas_series_folios')
				->where("serie = '".$data['info']->serie."'")
			->get();
			$data_serie = $res->row();
			$res->free_result();
				
				
			$this->load->library('mypdf');
			// Creación del objeto de la clase heredada
			$pdf = new MYpdf('P', 'mm', 'Letter');
			$pdf->show_head = false;
			$pdf->AddPage();
				
			$pdf->Image(APPPATH.'images/factura.jpg', .5, 0, 215, 279);
				
			$y = 40;
			$pdf->SetXY(171, 15);
			$pdf->SetFont('Arial','B', 12);
			$pdf->SetTextColor(204, 0, 0);
			$pdf->Cell(35, 8, ($data['info']->serie!=''? $data['info']->serie.'-': '').$data['info']->folio, 0, 0, 'C');
				
				
			$pdf->SetXY(158, 40);
			$pdf->SetFont('Arial','', 10);
			$pdf->SetTextColor(0, 0, 0);
			$pdf->Cell(48, 6, $data['info']->fecha, 0, 0, 'C');
			/*$pdf->SetXY(182, 50);
			$pdf->Cell(25, 6, $data['info']->serie, 0, 0, 'C');*/
			$pdf->SetXY(158, 58);
			$pdf->Cell(48, 6, ($data['info']->condicion_pago=='cr'? 'CREDITO': 'CONTADO'), 0, 0, 'C');
				
			$pdf->SetXY(28, 38);
			$pdf->Cell(128, 6, $data['info']->cliente->nombre_fiscal, 0, 0, 'L');
			$pdf->SetFont('Arial','', 9);
			$pdf->SetXY(28, 45);
			$pdf->Cell(128, 6, $data['info']->domicilio, 0, 0, 'L');
			$pdf->SetXY(28, 52);
			$pdf->Cell(128, 6, $data['info']->ciudad, 0, 1, 'L');
			$pdf->SetXY(28, 58);
			$pdf->Cell(128, 6, strtoupper($data['info']->cliente->rfc), 0, 1, 'L');
				
			$pdf->SetY(70);
			$aligns = array('C', 'C', 'C', 'C', 'C');
			$widths = array(14, 18, 113, 24, 27);
			$header = array('Cantidad', 'Descripción', 'Precio', 'Importe');
			foreach($data['productos'] as $key => $item){
				$band_head = false;
				if($pdf->GetY() >= 200 || $key==0){ //salta de pagina si exede el max
					if($key > 0)
						$pdf->AddPage();
				}
					
				$pdf->SetFont('Arial','',8);
				$pdf->SetTextColor(0,0,0);
					
				$datos = array($item->cantidad, $item->unidad2,
						$item->nombre,
						String::formatoNumero($item->precio_unitario),
						String::formatoNumero($item->importe));
					
				$pdf->SetX(11);
				$pdf->SetAligns($aligns);
				$pdf->SetWidths($widths);
				$pdf->Row($datos, false, false);
			}
				
			$pdf->SetFont('Arial','', 8.5);
			$pdf->SetXY(180, 182);
			$pdf->Cell(27, 6, string::formatoNumero($data['info']->subtotal), 0, 0, 'L');
			$pdf->SetXY(180, 188);
			$pdf->Cell(27, 6, string::formatoNumero($data['info']->importe_iva), 0, 0, 'L');
			$pdf->SetXY(180, 194);
			$pdf->Cell(27, 6, string::formatoNumero($data['info']->retencion_iva), 0, 0, 'L');
			$pdf->SetXY(180, 200);
			$pdf->Cell(27, 6, string::formatoNumero($data['info']->total), 0, 0, 'L');
			$pdf->SetXY(51, 185);
			$pdf->SetAligns(array('L'));
			$pdf->SetWidths(array(105));
			$pdf->Row(array(strtoupper(string::num2letras($data['info']->total))), false, false);
			
			$pdf->Image(APPPATH.'images/series_folios/'.$data['info']->img_cbb, 11, 185, 34, 34);
			
			$pdf->SetFont('Arial','', 8);
			$pdf->SetXY(50, 206);
			$pdf->Cell(155, 6, $data_serie->leyenda1, 0, 0, 'L');
			$pdf->SetXY(50, 209);
			$pdf->SetAligns(array('L'));
			$pdf->SetWidths(array(155));
			$pdf->Row(array($data_serie->leyenda2.' '.$data['info']->ano_aprobacion), false, false);
			
			$pdf->SetXY(50, 197);
			$pdf->Cell(106, 6, $data['info']->forma_pago, 0, 0, 'L');
			$pdf->SetXY(50, 201);
			$pdf->Cell(106, 6, 'Metodo de pago:'.$data['info']->metodo_pago.', '.$data['info']->metodo_pago_digitos, 0, 0, 'L');
			
			$pdf->SetFont('Arial','', 10);
			$pdf->SetXY(50, 217);
			$pdf->Cell(155, 6, "Actividad empresarial y profesional regimen intermedio", 0, 0, 'L');	
			$pdf->SetXY(153, 217);
			$pdf->Cell(55, 6, "Número de aprobación: ".$data_serie->no_aprobacion, 0, 0, 'L');	

			$pdf->SetXY(170, 226);
			$pdf->SetFont('Arial','B', 12);
			$pdf->SetTextColor(204, 0, 0);
			$pdf->Cell(35, 8, ($data['info']->serie!=''? $data['info']->serie.'-': '').$data['info']->folio, 0, 0, 'C');
			
			if($data['info']->status == 'ca')
				$pdf->Image(APPPATH.'images/cancelado.png', 3, 9, 215, 270);
				
			if ($type_output=='S'){
				return $pdf->Output($data['info']->cliente->rfc.'-'.
					($data['info']->serie!=''? $data['info']->serie.'-': '').$data['info']->folio.'.pdf', $type_output);
			}else{
				$pdf->Output($data['info']->cliente->rfc.'-'.
					($data['info']->serie!=''? $data['info']->serie.'-': '').$data['info']->folio.'.pdf', $type_output);
			}
		}
	}

	
	public function exist($table, $sql, $return_res=false){
		$res = $this->db->get_where($table, $sql);
		if($res->num_rows() > 0){
			if($return_res)
				return $res->row();
			return TRUE;
		}
		return FALSE;
	}
	
	
}